extensions/gggl{,-lies}.c: round toward nearest in integer unpremultiplication
authorMassimo Valentini <mvalentini@src.gnome.org>
Sat, 14 Jul 2012 15:07:38 +0000 (17:07 +0200)
committerMassimo Valentini <mvalentini@src.gnome.org>
Sat, 14 Jul 2012 15:07:38 +0000 (17:07 +0200)
from (docs/BablFishPath.html):
../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8
    error: 0.001425 cost: 81 processings: 1 pixels: 128
../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8
    error: 0.001971 cost: 71 processings: 1 pixels: 128
../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8
    error: 0.001971 cost: 71 processings: 1 pixels: 128

to:
../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8
    error: 0.000031 cost: 81 processings: 1 pixels: 128
../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8
    error: 0.000042 cost: 61 processings: 1 pixels: 128
../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8
    error: 0.000042 cost: 61 processings: 1 pixels: 128

extensions/gggl-lies.c
extensions/gggl.c

index d56a50ed5f4973a2938545f5d819c4e1c0933eb4..40e3fe0f1a0063fb6b6b854ed47e5ed6fd9db0b2 100644 (file)
@@ -1095,10 +1095,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
index f1fb8c06c9af8125ebf384021aad044d8ea54f5a..458de8d40202dcd9dfe3568f13b93b1a07cce548 100644 (file)
@@ -1066,10 +1066,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
@@ -1333,10 +1333,10 @@ conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / alpha;
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (alpha >> 1)) / alpha;
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
         }
       src += 4;
     }